package com.shujia


object Demo8Function {


  def main(args: Array[String]): Unit = {

    //定义函数
    def fun(x: Int, y: Int): Int = {
      return x * y
    }

    //调用函数
    println(fun(100, 200))
    //可以多次调用
    println(fun(100, 20))


    /**
     * 1、函数参数的默认值
     */

    def fun1(x: Int = 100, y: Int): Int = {
      return x * y
    }

    //在传递参数时，可以指定参数名称传参
    println(fun1(y = 10))
    println(fun1(10, 20))

    /**
     * 2、可变参数
     */

    def fun2(i: Int*): Unit = {
      println(i)
    }

    fun2(1, 1, 2, 3, 4)

    /**
     * 3、递归
     * 1、退出条件
     */

    def sqrt(i: Int): Int = {
      if (i == 1) {
        return 1
      }
      return i * sqrt(i - 1)
    }

    println(sqrt(5))


    /**
     * 4、函数的省略
     * 1、当最后一行作为返回值时，return可以省略
     * 2、如果函数体只有一行代码可以省略括号
     * 3、返回值类型可以省略，scala会自动推断返回值类型
     * 4、如果参数列表为空()可以省略
     */

    //1、当最后一行作为返回值时，return可以省略
    def sum(i: Int): Int = {
      if (i == 1) {
        //最后一行可以省略return
        1
      } else {
        i * sum(i - 1)
      }
    }

    println(sum(3))

    //2、如果函数体只有一行代码可以省略括号
    def add(x: Int, y: Int): Int = x + y

    println(add(10, 20))

    //3、返回值类型可以省略，scala会自动推断返回值类型
    def add1(x: Int, y: Int) = x + y

    //4、如果参数列表为空()可以省略
    def printline = println("无参函数")

    //在调用时也不需要加()
    printline


    /**
     * 5、lambda表达式(函数的简写,匿名函数) -- 一般用在以函数作为参数时
     * (x: Int, y: Int) => x * y
     * => 左边时参数列表
     * => 右边是函数体和返回值，返回值类型会自动推断
     */
    val fun4 = (x: Int, y: Int) => x * y

    println(fun4(2, 3))


  }
}
